package es.tikitaka.actions.colegiados;

import java.util.List;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.End;
import org.jboss.seam.annotations.FlushModeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.datamodel.DataModel;
import org.jboss.seam.annotations.datamodel.DataModelSelection;
import org.jboss.seam.faces.FacesMessages;

import es.tikitaka.dao.ColegiadoService;
import es.tikitaka.dao.ColegiosDicService;
import es.tikitaka.dao.MunicipioDicService;
import es.tikitaka.dao.ProvinciaDicService;
import es.tikitaka.dao.TemporadaService;
import es.tikitaka.dictionary.ColegioDic;
import es.tikitaka.dictionary.MunicipioDic;
import es.tikitaka.dictionary.ProvinciaDic;
import es.tikitaka.domain.Temporada;
import es.tikitaka.domain.colegiado.Colegiado;

/**
 * 
 * @author Saúl Domínguez
 * @since 2010
 * @category PFC
 */

@Name("colegiadoSearch")
@Scope(ScopeType.CONVERSATION)
public class ColegiadoSearch {

	private int modo;

	private Colegiado colegiadoElim;
	private Colegiado colegiadoAlta;
	private Colegiado colegiadoBaja;

	private String nombre;
	private String apellidos;
	private Temporada temporada;
	private ProvinciaDic provincia;
	private MunicipioDic municipio;
	private ColegioDic colegio;
	private Integer edad;
	private int activo = 1;

	private int totalRes;

	private List<ProvinciaDic> listaProvincias;
	private List<MunicipioDic> listaMunicipios;
	private List<Temporada> listaTemporadas;
	private List<ColegioDic> listaColegios;

	@DataModel("colegiados")
	private List<Colegiado> colegiados;
	@DataModelSelection("colegiados")
	private Colegiado colegiadoItem;

	@In(create = true)
	private ColegiadoService colegiadoService;

	@In(create = true)
	private ColegiosDicService colegioService;

	@In(create = true)
	private ProvinciaDicService provinciaService;

	@In(create = true)
	private MunicipioDicService municipioService;

	@In(create = true)
	private TemporadaService temporadaService;

	/**
	 * Constructor por defecto
	 */
	public ColegiadoSearch() {
		// TODO Auto-generated constructor stub
	}

	/**
	 * Método que inicializa la variable modo para que en la pantalla de
	 * búsqueda se cargen las opciones de eliminar
	 */
	public void modoEliminar() {
		modo = 1;
		cargaOpcionesBusqueda();
	}

	/**
	 * Método que inicializa la variable modo para que en la pantalla de
	 * búsqueda se cargen las opciones de edición
	 */
	@Begin(join = true, flushMode = FlushModeType.MANUAL)
	public void modoEdicion() {
		modo = 2;
		cargaOpcionesBusqueda();
	}

	/**
	 * Método que inicializa la variable modo para que en la pantalla de
	 * búsqueda se cargen las opciones de consulta
	 */
	@Begin(join = true, flushMode = FlushModeType.MANUAL)
	public void modoConsulta() {
		modo = 3;
		cargaOpcionesBusqueda();
	}

	/**
	 * Método que inicializa la variable modo para que en la pantalla de
	 * búsqueda se cargen las opciones de alta
	 */
	@Begin(join = true, flushMode = FlushModeType.MANUAL)
	public void modoAlta() {
		modo = 4;
		cargaOpcionesBusqueda();
	}

	/**
	 * Método que inicializa la variable modo para que en la pantalla de
	 * búsqueda se cargen las opciones de baja
	 */
	@Begin(join = true, flushMode = FlushModeType.MANUAL)
	public void modoBaja() {
		modo = 5;
		cargaOpcionesBusqueda();
	}

	/**
	 * Método que carga las opciones en la pantalla de búsqueda de colegiados
	 */
	public void cargaOpcionesBusqueda() {
		listaProvincias = provinciaService.getList();
		listaColegios = colegioService.getList();
		listaTemporadas = temporadaService.getList();
	}

	/**
	 * Método para buscar colegiados según los criterios de consulta
	 */
	public void buscar() {

		StringBuffer s = new StringBuffer();

		if (modo == 4) {
			// Busca los colegiados que se encuentren inactivos en este momento
			s
					.append("select c from Colegiado c left join fetch c.provincia p left join fetch c.municipio m ");
			s
					.append("left join fetch c.m_participaciones a left join fetch a.temporada t where c.activo = 'false' ");
		} else if (modo == 5) {
			// Busca los colegiados que se encuentran activos en este momento
			s
					.append("select c from Colegiado c left join fetch c.provincia p left join fetch c.municipio m ");
			s
					.append("left join fetch c.m_participaciones a left join fetch a.temporada t where c.activo = 'true' ");
		} else {
			// Busca los colegiados según el estado seleccionado
			if (activo == 1) {
				s
						.append("select c from Colegiado c left join fetch c.provincia p left join fetch c.municipio m ");
				s
						.append("left join fetch c.m_participaciones a left join fetch a.temporada t where c.activo = 'true' ");
			} else if (activo == 2) {
				s
						.append("select c from Colegiado c left join fetch c.provincia p left join fetch c.municipio m ");
				s
						.append("left join fetch c.m_participaciones a left join fetch a.temporada t where c.activo = 'false' ");
			}

		}

		if (nombre != null && nombre.length() > 0) {
			s.append("and upper(c.nombre) like upper('%'||?1||'%') ");
		}
		if (apellidos != null && apellidos.length() > 0) {
			s.append("and upper(c.apellidos) like upper('%'||?2||'%') ");
		}
		if (edad != null) {
			s.append(" and a.edad = ?3 ");
		}
		if (temporada != null) {
			s.append("and a.temporada.id = ?4 ");
		}
		if (provincia != null) {
			s.append("and p.id = ?5 ");
		}
		if (municipio != null) {
			s.append("and m.id = ?6 ");
		}
		if (colegio != null) {
			s.append("and a.colegio.id = ?7 ");
		}
		s.append("order by c.apellidos, c.nombre");

		colegiados = colegiadoService.buscar(nombre, apellidos, temporada,
				colegio, provincia, municipio, edad, s);

		totalRes = colegiados.size();
	}

	/**
	 * Método que selecciona a un colegiado para su eliminación
	 * 
	 * @param colegiado
	 *            Colegiado a eliminar
	 */
	public void eliminar(Colegiado colegiado) {
		colegiadoElim = colegiado;
	}

	/**
	 * Método para eliminar a un colegiado del sistema
	 */
	public void eliminar() {

		if (colegiadoElim != null) {
			if (colegiadoElim.getM_participaciones() != null
					&& colegiadoElim.getM_participaciones().size() > 0) {
				FacesMessages
						.instance()
						.add(
								"No se puede eliminar al colegiado porque tiene datos de temporadas");
			} else {
				boolean b = colegiadoService.delete(colegiadoElim.getId());
				if (b) {
					FacesMessages
							.instance()
							.add(
									"El colegiado seleccionado se ha eliminado correctamente.");
				} else {
					FacesMessages
							.instance()
							.add(
									"El colegiado no se ha podido eliminar del sistema.");
				}
			}
		}
	}

	/**
	 * Método que selecciona a un colegiado para su baja
	 * 
	 * @param colegiado
	 *            Colegiado a dar de baja
	 */
	public void baja(Colegiado colegiado) {
		colegiadoBaja = colegiado;
	}

	/**
	 * Método para dar de baja a un colegiado del sistema
	 */
	public void baja() {
		if (colegiadoBaja != null) {
			colegiadoBaja.setActivo(false);
			boolean b = colegiadoService.save(colegiadoBaja);
			if (b) {
				colegiados.remove(colegiadoBaja);
				totalRes = colegiados.size();
				FacesMessages.instance().add(
						"El colegiado ha sido dado de baja correctamente.");
			} else {
				FacesMessages
						.instance()
						.add(
								"Se ha producido un error y no se ha podido dar la baja al colegiado.");
			}
		} else {
			FacesMessages.instance().add(
					"No hay ningún colegiado seleccionado para dar la baja");
		}
	}

	/**
	 * Método que selecciona a un colegiado para su alta
	 * 
	 * @param colegiado
	 *            Colegiado a dar de baja
	 */
	public void alta(Colegiado colegiado) {
		colegiadoAlta = colegiado;
	}

	/**
	 * Método para dar de alta a un colegiado del sistema
	 */
	public void alta() {
		if (colegiadoAlta != null) {
			colegiadoAlta.setActivo(true);
			boolean b = colegiadoService.save(colegiadoAlta);
			if (b) {
				colegiados.remove(colegiadoAlta);
				totalRes = colegiados.size();
				FacesMessages.instance().add(
						"El colegiado ha sido dado de alta correctamente.");
			} else {
				FacesMessages
						.instance()
						.add(
								"Se ha producido un error y no se ha podido dar el alta al colegiado.");
			}
		} else {
			FacesMessages.instance().add(
					"No hay ningún colegiado seleccionado para dar el alta");
		}
	}

	/**
	 * Método para limpiar los criterios de búsqueda del formularios
	 */
	public void limpiar() {
		nombre = null;
		apellidos = null;
		provincia = null;
		municipio = null;
		temporada = null;
		edad = null;
		colegio = null;
		colegiados = null;
		listaMunicipios = null;
		activo = 1;
	}

	@End
	public void volver() {
		limpiar();
	}

	@End
	public void menu() {
		limpiar();
	}

	/*
	 * getters and setters
	 */

	/**
	 * 
	 * @return
	 */
	public int getModo() {
		return modo;
	}

	/**
	 * 
	 * @param modo
	 */
	public void setModo(int modo) {
		this.modo = modo;
	}

	/**
	 * 
	 * @return
	 */
	public Colegiado getColegiadoElim() {
		return colegiadoElim;
	}

	/**
	 * 
	 * @param colegiadoElim
	 */
	public void setColegiadoElim(Colegiado colegiadoElim) {
		this.colegiadoElim = colegiadoElim;
	}

	/**
	 * 
	 * @return
	 */
	public Colegiado getColegiadoAlta() {
		return colegiadoAlta;
	}

	/**
	 * 
	 * @param colegiadoAlta
	 */
	public void setColegiadoAlta(Colegiado colegiadoAlta) {
		this.colegiadoAlta = colegiadoAlta;
	}

	/**
	 * 
	 * @return
	 */
	public Colegiado getColegiadoBaja() {
		return colegiadoBaja;
	}

	/**
	 * 
	 * @param colegiadoBaja
	 */
	public void setColegiadoBaja(Colegiado colegiadoBaja) {
		this.colegiadoBaja = colegiadoBaja;
	}

	/**
	 * 
	 * @return
	 */
	public String getNombre() {
		return nombre;
	}

	/**
	 * 
	 * @param nombre
	 */
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	/**
	 * 
	 * @return
	 */
	public String getApellidos() {
		return apellidos;
	}

	/**
	 * 
	 * @param apellidos
	 */
	public void setApellidos(String apellidos) {
		this.apellidos = apellidos;
	}

	/**
	 * 
	 * @return
	 */
	public Temporada getTemporada() {
		return temporada;
	}

	/**
	 * 
	 * @param temporada
	 */
	public void setTemporada(Temporada temporada) {
		this.temporada = temporada;
	}

	/**
	 * 
	 * @return
	 */
	public ProvinciaDic getProvincia() {
		return provincia;
	}

	/**
	 * 
	 * @param provincia
	 */
	public void setProvincia(ProvinciaDic provincia) {
		this.provincia = provincia;
	}

	/**
	 * 
	 * @return
	 */
	public MunicipioDic getMunicipio() {
		return municipio;
	}

	/**
	 * 
	 * @param municipio
	 */
	public void setMunicipio(MunicipioDic municipio) {
		this.municipio = municipio;
	}

	/**
	 * 
	 * @return
	 */
	public ColegioDic getColegio() {
		return colegio;
	}

	/**
	 * 
	 * @param colegio
	 */
	public void setColegio(ColegioDic colegio) {
		this.colegio = colegio;
	}

	/**
	 * 
	 * @return
	 */
	public Integer getEdad() {
		return edad;
	}

	/**
	 * 
	 * @param edad
	 */
	public void setEdad(Integer edad) {
		this.edad = edad;
	}

	/**
	 * 
	 * @return
	 */
	public int getActivo() {
		return activo;
	}

	/**
	 * 
	 * @param activo
	 */
	public void setActivo(int activo) {
		this.activo = activo;
	}

	/**
	 * 
	 * @return
	 */
	public int getTotalRes() {
		return totalRes;
	}

	/**
	 * 
	 * @param totalRes
	 */
	public void setTotalRes(int totalRes) {
		this.totalRes = totalRes;
	}

	/**
	 * 
	 * @return
	 */
	public List<ProvinciaDic> getListaProvincias() {
		return listaProvincias;
	}

	/**
	 * 
	 * @param listaProvincias
	 */
	public void setListaProvincias(List<ProvinciaDic> listaProvincias) {
		this.listaProvincias = listaProvincias;
	}

	/**
	 * 
	 * @return
	 */
	public List<MunicipioDic> getListaMunicipios() {
		if (provincia != null) {
			listaMunicipios = municipioService.getList(provincia);
		}
		return listaMunicipios;
	}

	/**
	 * 
	 * @param listaMunicipios
	 */
	public void setListaMunicipios(List<MunicipioDic> listaMunicipios) {
		this.listaMunicipios = listaMunicipios;
	}

	/**
	 * 
	 * @return
	 */
	public List<Temporada> getListaTemporadas() {
		return listaTemporadas;
	}

	/**
	 * 
	 * @param listaTemporadas
	 */
	public void setListaTemporadas(List<Temporada> listaTemporadas) {
		this.listaTemporadas = listaTemporadas;
	}

	/**
	 * 
	 * @return
	 */
	public List<ColegioDic> getListaColegios() {
		return listaColegios;
	}

	/**
	 * 
	 * @param listaColegios
	 */
	public void setListaColegios(List<ColegioDic> listaColegios) {
		this.listaColegios = listaColegios;
	}

	/**
	 * 
	 * @return
	 */
	public List<Colegiado> getColegiados() {
		return colegiados;
	}

	/**
	 * 
	 * @param colegiados
	 */
	public void setColegiados(List<Colegiado> colegiados) {
		this.colegiados = colegiados;
	}

	/**
	 * 
	 * @return
	 */
	public Colegiado getColegiadoItem() {
		return colegiadoItem;
	}

	/**
	 * 
	 * @param colegiadoItem
	 */
	public void setColegiadoItem(Colegiado colegiadoItem) {
		this.colegiadoItem = colegiadoItem;
	}
}
